package graph;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Image;
import java.io.IOException;
import java.util.HashMap;
import javax.swing.JPanel;

import back.Agujero;
import back.Caja;
import back.Camino;
import back.Celda;
import back.Coordenada;
import back.Destino;
import back.Juego;
import back.Jugador;
import back.Movible;
import back.NoMovible;
import back.Pared;
import back.Tablero;
import back.Vacio;
import back.VacioM;

public class ImprimeTablero2 extends JPanel {

	/*
	 * Imprimetablero permite imprimir todos los elementos del tablero,
	 * y crea el board panel. 
	 */
	private static final long serialVersionUID = 1L;

	private static final int CELL_SIZE = 30;
	
	
	private BoardPanel bp;
	private HashMap<Class, Image> imagenes; 
	private Image img;
	private Juego juego;
	
	
	/*
	 * Crea el board panel, 
	 * 
	 * 
	 */
	public ImprimeTablero2( final Juego juego) {
		this.juego=juego;
		setBackground(new Color (50,200,50));
		setLayout(new BorderLayout());
		Tablero tablero= juego.getTablero();
		setSize(tablero.getCols() * (CELL_SIZE + 2), tablero.getFils() * (CELL_SIZE + 10));

		try {
			imagenes=new HashMap<Class,Image>();
			img=ImageUtils.loadImage("resources/box.png");
			imagenes.put(Caja.class, ImageUtils.loadImage("resources/box.png"));
			imagenes.put(Agujero.class, ImageUtils.loadImage("resources/hole.png"));
			imagenes.put(Pared.class, ImageUtils.loadImage("resources/wall.jpg"));
			imagenes.put(Camino.class,ImageUtils.loadImage("resources/path.png"));
			imagenes.put(Destino.class, ImageUtils.loadImage("resources/target.png"));
			imagenes.put(Jugador.class, ImageUtils.loadImage("resources/smile.png"));
		
		} catch (IOException e) {
			String mensaje = "Problemas al cargar imagenes";
			new MensajeFrame(mensaje);
		}
		
		bp = new BoardPanel(tablero.getFils(), tablero.getCols(), CELL_SIZE);
		bp.setBackground(Color.WHITE);
		add(bp);
		this.imprime(juego);
		setVisible(true);
	}
	/*
	 * Imprime una imagen en una coordenada dada del tablero
	 */
	public void printImage(Image img, Coordenada coord){
		bp.setImage(coord.getX(), coord.getY(), img);
	}
	/*
	 *Tiñe una imagen del color pedido 
	 */
	public Image dyeImage(Image img, Color color){
		return ImageUtils.dye(img, color);
	}
	/*
	 * Imprime el tablero con cada uno de los elementos contenidos en
	 * cada celda
	 */
	public void imprime(final Juego juego){
		for(int i=0;i<juego.getTablero().getFils();i++){
			for(int j=0;j<juego.getTablero().getCols();j++){
				Coordenada coord = new Coordenada(i, j);
				Celda celda = juego.getTablero().getCelda(coord);
				this.ImprimeNoMov(celda, coord);
				this.ImprimeMov(celda, coord);
			}
		}
	}
	/*
	 * Imprime los elementos no movibles del tablero
	 */
	public void ImprimeNoMov(Celda celda, Coordenada coord){
		int i=coord.getX(), j=coord.getY();
		NoMovible noMov=celda.getNoMovible();
		Class noMovC=noMov.getClass();
		if(noMovC==Vacio.class)
			return;
		if(noMov.getClass() == Camino.class){
				int direc= ((Camino)noMov).getDireccion();
				Image im=(Image)imagenes.get(noMovC);
				im= ImageUtils.rotateImage(im, direc);
				bp.setImage(i, j, im);
				return;
			}
		if(noMov.getClass() == Destino.class){
			Image im=(Image)imagenes.get(noMovC);
			Color color= ((Destino)noMov).getColor();
			im= ImageUtils.dye(im, color);
			bp.setImage(i, j, im);
			return;
		}
		
		bp.setImage(i, j, (Image)imagenes.get(noMovC));
			
		}
	/* 
	 * Imprime los elementos movibles del tablero
	 */
	public void ImprimeMov(Celda celda, Coordenada coord){
		int i=coord.getX(), j=coord.getY();
		Movible mov = celda.getMovible();
		Class clase = mov.getClass();
		if(clase==VacioM.class)
			return;
		if(mov.getClass() == Caja.class){
				Color color= ((Caja)mov).getColor();
				Image im=(Image)imagenes.get(clase);
				im= ImageUtils.dye(im, color);
				if(celda.brilla()){
					im=ImageUtils.increaseBrightness(im);
				}
				bp.setImage(i, j, im);
				return;
			}
		bp.setImage(i, j, (Image)imagenes.get(clase));
		}		


}
